package cn.cvs.dao;

import cn.cvs.pojo.SysUser;
import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.ResultMap;
import org.apache.ibatis.annotations.Select;

import java.util.List;
import java.util.Map;
import java.util.Set;

//SysUserDao
//@CacheNamespace //开启注解定义的二级缓存
//不能和<cache/>标签同时使用
public interface SysUserMapper {

    //依据account和password查询用户
    @Select("select * from t_sys_user where account=#{account} and password=#{password}")
    SysUser queryOne(@Param("account") String account, @Param("password") String password);


    //查询所有的用户
    List<SysUser> queryAll();

    //查询所有的用户,使用注解
    @Select("select * from t_sys_user")
    List<SysUser> findAll();

    //依据编号查询用户
    @Select(" select u.*,r.roleName" +
            " from t_sys_user u left join t_sys_role r " +
            " on u.roleId=r.id " +
            " where u.id=#{id}")
    @ResultMap(value = "SysUserMap")
    SysUser queryById(int id);

    SysUser findById(Integer id);

    //依据用户名RealName 和 角色id roleId
    List<SysUser> queryList(SysUser sysUser);

    //依据用户名RealName 和 角色id roleId 参数为Map
    List<SysUser> queryListByMap(Map<String,Object> map);

    //依据用户名RealName 和 角色id roleId 参数添加注解@Param
    List<SysUser> queryListByParam(@Param("realName") String realName, @Param("roleId") Integer roleId);

    //查询所有用户 (包含角色名称)
    List<SysUser> queryListWithRoleName();

    //resultMap 查询所有用户 (包含角色名称)
    List<SysUser> queryListWithRoleName2();

    //resultMap 查询所有用户 (包含扩展的角色对象)
    List<SysUser> queryListWithRole();

    //添加一个用户
    int add(SysUser sysUser);

    //修改一个用户
    //依据编号（主键）去修改，可以修改除开编号以外所有的字段
    int modify(SysUser sysUser);

    //删除一个用户
    @Delete("delete from t_sys_user where id=#{id}")
     int deleteById(Integer id);

    //以下为动态SQL
    //if 依据realName(模糊) 和 roleId查询用户信息
    List<SysUser> queryDList(@Param("realName") String realName, @Param("roleId") Integer roleId);
    //if + where
    List<SysUser> queryDList2(@Param("realName") String realName, @Param("roleId") Integer roleId);
    //choose + when + otherwise
    List<SysUser> queryDList3(@Param("account") String account, @Param("realName") String realName, @Param("roleId") Integer roleId);
   //foreach
    //通过id查询多个用户
    List<SysUser> queryListById(@Param("ids") List<Integer> ids);
    List<SysUser> queryListById(@Param("ids") Set<Integer> ids);
    List<SysUser> queryListById(@Param("ids") Integer[] ids);
    List<SysUser> queryListById(@Param("ids") Map<String,Integer> ids);

    int update(SysUser sysUser);

    //trim 查询
    List<SysUser>  queryDList4(@Param("realName") String realName, @Param("roleId") Integer roleId);
   //trim 修改
    int updateTrim(SysUser sysUser);
    //分页查询
    List<SysUser> queryPage(@Param("pageBegin") Integer pageBegin, @Param("pageSize") Integer pageSize);

    //依据realName 和 roleId查询
     //分页  pageBeign   pageSize
    //动态SQL
    List<SysUser> queryByPage(@Param("realName") String realName, @Param("roleId") Integer roleId, @Param("pageBegin") Integer pageBegin, @Param("pageSize") Integer pageSize);

    //参与条件分页的总记录数
    //realName 和 roleId
    int queryCount(@Param("realName") String realName, @Param("roleId") Integer roleId);
    //依据account查询用户的数量
    @Select(" select count(0) from t_sys_user where account=#{account}")
    int queryUserCount(@Param("account") String account);
}
